package com.huluobo.jetpackkotlindemo.coroutine

import android.os.Bundle
import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.huluobo.jetpackkotlindemo.databinding.ActivityFlowBinding
import com.huluobo.jetpackkotlindemo.viewbinding.BaseActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

/**
 * Created by lc on 2022/12/19.
 * flow:Kotlin的数据流,他可以发送多条数据,可以按照顺序发送多个值,在withContext或者async中只能发送一个值
 * 1.emit是发送的意思
 * 2.flow是一个挂起方法,必须要运行到协程中
 * 3.flow是数据流,但是是一个冷流 冷流:是在数据被订阅后,发布者才会执行发射数据流的代码(类似于懒加载)
 * 4.collect是订阅,收集的意思,一个flow必须要订阅后才能发送数据
 * 5.filter是过滤器,可以将发送的内容进行判断和过滤再被订阅者接收
 * 6.map是转化器,可以将发送的数据流转换为任意类型进行输出
 */
class FlowActivity : BaseActivity<ActivityFlowBinding>() {
    override fun getViewBinding(): ActivityFlowBinding = ActivityFlowBinding.inflate(layoutInflater)

//    private fun loadData() = flow {
//        Log.i("TagA", "------进入loadData方法------")
//        for (i in 1..5) {
//            delay(1000)
//            emit(i)
//        }
//    }.filter {
//        it % 2 == 0 //添加的是一个判断
//    }

    private fun loadData() = flow {
        Log.i("TagA", "------进入loadData方法------")
        for (i in 1..5) {
            delay(1000)
            emit(i)
        }
    }.flowOn(Dispatchers.IO)
    //如何去捕获一个flow的异常
//        .catch { catch ->
//        Log.i("TagA", catch.message.toString())
//    }
    //flow的转换,通过map可以将flow中的值指定为其他形式或者其他类型
//        .map {
//        it * 5
//    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleScope.launch {
            loadData().collect {
                Log.i("TagA", it.toString())
            }
        }
    }
}